// 知识点1：面向对象程序设计的三个基本概念：数据抽象、继承和动态绑定(核心概念)

// 数据抽象：将类的接口与实现分离

// 继承：我们可以定义与其他类相似但完全不相同的新类

// 动态绑定：在使用这些彼此相似的类时，在一定程度上忽略他们的区别，统一使用它们的对象

// 知识点2：类的继承构成一种层次关系，在层次根部的为基类，其他类则直接或者间接的从基类中继承而来，称为派生类

// 基类负责定义在层次关系中所有类共有的数据成员，而派生类定义各自特有的成员

// 知识点3：对于某些函数，基类希望它的派生类各自定义适合其自身的版本，基类会将该函数声明为虚函数！！！而派生类必须在其内部对所有重新定义的虚函数进行声明，若不加virtual关键字，可以在其后加上override显式声明改写基类的虚函数

// 知识点4：派生类必须通过使用类派生列表明确指出它是从哪个基类中继承而来的：冒号+（访问限定符）基类列表

// 知识点5：动态绑定，函数的运行版本由实参决定也被称为运行时绑定：在使用基类的引用调用一个虚函数时将会发生动态绑定！！！当我们使用指针或者引用调用虚函数时，将调用动态绑定

// 知识点6：基类通常应该定义一个虚析构函数，即使该函数不执行任何操作也是如此！

// 知识点7：关键词virtual只能出现在类内的声明函数语句之前，而不能用于类外部的函数定义，在派生类中相应的函数将隐式的是虚函数（不加virtual的情况）

// 知识点8：非虚函数，其解析过程将发生在编译时而非运行时

// 知识点9：protected受保护的成员，基类希望它的派生类有权访问该成员，同时禁止其他用户访问，而private即使是其派生类也不能访问

// 虚成员就是虚函数，详解见知识点